package com.bai.ruiji.Common;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 全局异常处理
 * @ControllerAdvice
 *  概念：Controller增强器，给Controller控制器添加统一的操作
 *   1、@ControllerAdvice 配合 @ExceptionHandler 实现全局异常捕捉处理，用于捕获Controller中抛出的指定类型的异常
 *   2、@ControllerAdvice 配合 @ModelAttribute 预设全局数据，表示其注解的方法会在目标Controller方法之前执行，使全局@RequestMapping可以获取到该值
 *   3、@ControllerAdvice 配合 @InitBinder 实现对请求参数的预处理，用于request中自定义参数解析方式进行注册，从而达到自定义指定格式参数的目的
 * @author 27471
 * Time : 2022/10/8 15:07
 */
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody//以JSON格式返回
@Slf4j
public class GlobalExptionHandler {
    /**
     * 异常处理
     * @return
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
   public R<String> exptioinHandler(SQLIntegrityConstraintViolationException ex){
      log.error(ex.getMessage());
      if (ex.getMessage().contains("Duplicate entry")){
          String[] split = ex.getMessage().split(" ");
          String msg=split[2]+"已存在";
          return R.error(msg);
      }
       return R.error("未知错误");
   }
    /**
     * 异常处理
     * @return
     */
    @ExceptionHandler(CustomException.class)
    public R<String> exptioinHandler(CustomException ex){
        log.error(ex.getMessage());
        return R.error(ex.getMessage());
    }
}
